#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int T;
int maxn;
int n,m,l,V;
int cnt;
int p[N];
bool sub1=true,sub2=true,sub3=true;
struct car{
    int d,v,a;
    int st;
    int vis=0;
}c[N];
int h[N];
vector<int>g[N];
bool ys[N];
bool check(){
    for(int i=1;i<=n;i++)h[i]=c[i].vis;
    for(int i=1;i<=m;i++){
        if(ys[i]){
            for(int j=0;j<g[i].size();j++){
                int x=g[i][j];
                h[x]--;
                if(!h[x]){
                    return false;
                }
            }
        }
    }
    return true;
}
void dfs(int idx,int ct){
    if(idx==m){
        if(check()){
            maxn=max(maxn,ct);
        }
        return;
    }
    ys[idx+1]=true;
    dfs(idx+1,ct+1);
    ys[idx+1]=false;
    dfs(idx+1,ct);
    return;
}
void s1(){
    cnt=0;
    for(int i=1;i<=n;i++){
        if(c[i].d>p[m])continue;
        if(c[i].v>V)cnt++;
    }
    if(cnt)cout<<cnt<<" "<<m-1<<'\n';
    else cout<<cnt<<" "<<m<<'\n';
}
void s2(){
    cnt=0;
    for(int i=1;i<=n;i++){
        if(c[i].d>p[m])continue;
        double x=double(double(c[i].v+V)/2)*double(V-c[i].v)/double(c[i].a);
        if(double(p[m]-c[i].d)>x)cnt++;
    }
    if(cnt)cout<<cnt<<" "<<m-1<<'\n';
    else cout<<cnt<<" "<<m<<'\n';
}
void s(){
    cnt=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(c[i].d>p[j])continue;
            if(c[i].a==0){
                if(c[i].v>V){
                    c[i].vis++;
                    g[j].push_back(i);
                }
            }
            else if(c[i].a>0){
                double x=double(double(c[i].v+V)/2)*double(V-c[i].v)/double(c[i].a);
                if(double(p[j]-c[i].d)>x){
                    c[i].vis++;
                    g[j].push_back(i);
                }
            }
            else{
                if(c[i].v<=V)break;
                double x=double(double(c[i].v+V)/2)*double(V-c[i].v)/double(c[i].a);
                if(double(p[j]-c[i].d)<x){
                    c[i].vis++;
                    g[j].push_back(i);
                }
            }
        }
        if(c[i].vis)cnt++;
    }
    cout<<cnt<<" ";
    if(cnt==0)cout<<m<<'\n';
    else{
        for(int i=1;i<=m;i++)ys[i]=false;
        maxn=-1;
        dfs(0,0);
        cout<<maxn<<'\n';
    }
}
void solve(){
    sub1=true;
    sub2=true;
    sub3=true;
    cin>>n>>m>>l>>V;
    for(int i=1;i<=n;i++){
        cin>>c[i].d>>c[i].v>>c[i].a;
        c[i].vis=0;
        if(c[i].a!=0)sub1=false;
        if(c[i].a<=0)sub2=false;
        if(c[i].a>=0)sub3=false;
    }
    for(int i=1;i<=m;i++)cin>>p[i];
    if(sub1){
      s1();return;
    }
    if(sub2){
        s2();return;
    }
    if(n<=20){
        for(int i=1;i<=m;i++)g[i].clear();
        s();
        return;
    }
    return;
}
int main(){
  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
/*
1
5 5 15 3
0 5 -1
1 5 -1
6 5 -1
10 5 -1
12 5 -1
0 5 10 11 15
*/
